package com.qf.service.impl;

import com.qf.model.StandardSubmit;
import com.qf.service.Strategy;
import com.qf.service.api.CacheService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 五分钟限流策略/流量控制
 * @author 何星宇
 * @version V1.0
 * @Date 2021/11/23 19:32
 */

@Service(value = "limitFiveMinutes")
@Slf4j
public class LimitFiveMinutesStrategy implements Strategy {
    @Autowired
    private CacheService cacheService;
    @Override
    public boolean strategy(StandardSubmit standardSubmit) {
        //记录日志
        log.info("【策略模块-五分钟限流策略】 策略开始执行！");
        String limitKey = "LIMIT:"+ standardSubmit.getClientID();
        //查询该用户五分钟内是否发过短信
        String limit = cacheService.get(limitKey);
        if (StringUtils.isEmpty(limit)){
            //没有发送过短信
            //创建limit
            cacheService.incr(limitKey, 1);
            //增加生存时间
            cacheService.expire(limitKey, 3000L);
            log.info("【策略模块-五分钟限流策略】 五分钟限流策略执行通过！ 当前该用户五分钟内发送短信次数为：{}",1);
            return true;
        }
        if (Integer.parseInt(limit)>=5){
            //超出限流数量停止发送
            log.info("【策略模块-五分钟限流策略】 策略执行未通过！ 当前该用户五分钟内发送短信次数为：{}",Integer.parseInt(limit)+1);
            return false;
        }
        cacheService.incr(limitKey, 1);
        log.info("【策略模块-五分钟限流策略】 策略执行通过！ 当前该用户五分钟内发送短信次数为：{}",Integer.parseInt(limit)+1);

        return true;
    }
}
